﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;


namespace WAVEZ
{
    class Nivel_Teste : SceneBase
    {
        public Personagem personagem;
        //Inimigo1 inimigo;
        Camera3D camera;
        public static Nivel_Teste instancia;
        Objeto3D paredeUp, paredeDown, paredeR, paredeL;
        public float nivelSlow;

        public Objeto2D fundo;

        public override void start()
        {
            instancia = this;
            
            camera = new Camera3D(Game1.Self.GraphicsDevice);
            camera.position.X = 0;
            camera.position.Y = 150;
            camera.position.Z = 100;

            camera.lookAt = new Vector3(0, 0, 0);
            SoundManager.PararMusica("Musica_Menu");

            //Criação do personagem
            personagem = new Personagem(Game1.Self.Content.Load<Model>("personagem"));
            personagem.posicao.Y = 0;

            //inimigo = new Inimigo1(Game1.Self.Content.Load<Model>("personagem"));
            //inimigo.posicao.X = -25;
            

            paredeUp = new Objeto3D(Game1.Self.Content.Load<Model>("personagem"));
            paredeUp.posicao.Y = 8;
            paredeUp.posicao.Z = -60;
            paredeUp.escala.Z = 0.4f;
            paredeUp.escala.Y = 5;
            paredeUp.escala.X = 50;

            paredeDown = new Objeto3D(Game1.Self.Content.Load<Model>("personagem"));
            paredeDown.posicao.Y = 8;
            paredeDown.posicao.Z = 60;
            paredeDown.escala.Z = 0.4f;
            paredeDown.escala.Y = 5;
            paredeDown.escala.X = 50;

            paredeR = new Objeto3D(Game1.Self.Content.Load<Model>("personagem"));
            paredeR.posicao.Y = 8;
            paredeR.posicao.Z = 0;
            paredeR.posicao.X = 100;
            paredeR.escala.Z = 50f;
            paredeR.escala.Y = 5;
            paredeR.escala.X = 0.4f;

            paredeL = new Objeto3D(Game1.Self.Content.Load<Model>("personagem"));
            paredeL.posicao.Y = 8;
            paredeL.posicao.Z = 0;
            paredeL.posicao.X = -100;
            paredeL.escala.Z = 50f;
            paredeL.escala.Y = 5;
            paredeL.escala.X = 0.4f;


            fundo = new Objeto2D(Game1.Self.Content.Load<Texture2D>("fundo"));
            fundo.posicao.X = 400;
            fundo.posicao.Y = 240;

            Pontos.Initialize();
        }

        public override void update(GameTime gameTime)
        {
            personagem.Update(gameTime);
            //inimigo.Update(gameTime);
            TiroManager.Update(gameTime);
            InimigoManager.Update(gameTime);
            SlowGeral();


            Console.WriteLine(Pontos.pontos);
            
            camera.lookAt = new Vector3(personagem.posicao.X, personagem.posicao.Y, personagem.posicao.Z);

            
            //#region Contador de ondas
            
            //if (InimigoManager.contador <= 200 && InimigoManager.onda == 0)
            //{
            //    InimigoManager.contador++;

            //}

            //if (InimigoManager.contador == 200 && InimigoManager.onda == 0)// || (InimigoManager.listaInimigos.Count == 0 && InimigoManager.onda == 0))
            //{
            //    InimigoManager.contador = 0;
            //    InimigoManager.onda = 1;
            //    InimigoManager.repor = true;
            //}

            //if (InimigoManager.contador <= 300 && InimigoManager.onda == 1)
            //{
            //    InimigoManager.contador++;
            //}

            //if ((InimigoManager.contador == 300 && InimigoManager.onda == 1) || (InimigoManager.listaInimigos.Count == 0 && InimigoManager.onda == 1))
            //{
            //    InimigoManager.contador = 0;
            //    InimigoManager.onda = 2;
            //    InimigoManager.repor = true;
            //}

            //if (InimigoManager.contador <= 300 && InimigoManager.onda == 2)
            //{
            //    InimigoManager.contador++;
            //}

            //if ((InimigoManager.contador == 300 && InimigoManager.onda == 2) || (InimigoManager.listaInimigos.Count == 0 && InimigoManager.onda == 2))
            //{
            //    InimigoManager.contador = 0;
            //    InimigoManager.onda = 3;
            //    InimigoManager.repor = true;
            //}

            //if (InimigoManager.contador <= 300 && InimigoManager.onda == 3)
            //{
            //    InimigoManager.contador++;
            //}

            //if ((InimigoManager.contador == 300 && InimigoManager.onda == 3) || (InimigoManager.listaInimigos.Count == 0 && InimigoManager.onda == 3))
            //{
            //    InimigoManager.contador = 0;
            //    InimigoManager.onda = 3;
            //    InimigoManager.repor = true;
            //}
            
            //#endregion

            #region Criação de inimigos
            if (InimigoManager.onda == 0 && InimigoManager.listaInimigos.Count == 0)//InimigoManager.repor == true)
            {
                InimigoManager.CriarInimigo(new Vector3(0, 0, -35),1);
                InimigoManager.CriarInimigo(new Vector3(-35, 0, 20),1);
                InimigoManager.CriarInimigo(new Vector3(35, 0, 20),1);
                InimigoManager.onda = 1;
            }

            if (InimigoManager.onda == 1 && InimigoManager.listaInimigos.Count == 0)//InimigoManager.repor == true)
            {
                InimigoManager.CriarInimigo(new Vector3(0, 0, -45),2);
                InimigoManager.CriarInimigo(new Vector3(-35, 0, 0),1);
                InimigoManager.CriarInimigo(new Vector3(35, 0, 0),1);
                InimigoManager.CriarInimigo(new Vector3(0, 0, 35),1);
                InimigoManager.onda = 2;
            }

            if (InimigoManager.onda == 2 && InimigoManager.listaInimigos.Count == 0)//InimigoManager.repor == true)
            {
                InimigoManager.CriarInimigo(new Vector3(0, 0, -45),2);
                InimigoManager.CriarInimigo(new Vector3(-35, 0, -25),1);
                InimigoManager.CriarInimigo(new Vector3(35, 0, -35),1);
                InimigoManager.CriarInimigo(new Vector3(-35, 0, 25),2);
                InimigoManager.CriarInimigo(new Vector3(35, 0, 35),2);
                InimigoManager.onda = 3;
            }

            if (InimigoManager.onda == 3 && InimigoManager.listaInimigos.Count == 0)//InimigoManager.repor == true)
            {
                InimigoManager.CriarInimigo(new Vector3(0, 0, -45),2);
                InimigoManager.CriarInimigo(new Vector3(-35, 0, -35),2);
                InimigoManager.CriarInimigo(new Vector3(35, 0, -35),2);
                InimigoManager.CriarInimigo(new Vector3(35, 0, 35),2);
                InimigoManager.CriarInimigo(new Vector3(-35, 0, 35),2);
                InimigoManager.CriarInimigo(new Vector3(0, 0, 45), 2);
                InimigoManager.onda = 3;
            }
            #endregion

            //InimigoManager.repor = false;



     /*colisão com a parede*/       for (int t = 0; t < TiroManager.listaTiros.Count; t++)
            {

                Tiro umTiro = TiroManager.listaTiros[t];


                if (umTiro.posicao.X >= paredeR.posicao.X)
                    TiroManager.listaTiros.Remove(umTiro);

                else if (umTiro.posicao.X <= paredeL.posicao.X)
                    TiroManager.listaTiros.Remove(umTiro);

                else if (umTiro.posicao.Z <= paredeUp.posicao.Z)
                    TiroManager.listaTiros.Remove(umTiro);

                else if (umTiro.posicao.Z >= paredeDown.posicao.Z - 3f)
                    TiroManager.listaTiros.Remove(umTiro);

            }






            if (paredeUp.hitTestObject(personagem))
            {
                if (personagem.velocidade.Z < 0)
                {
                    personagem.velocidade.Z = 0;
                }
            }

            if (paredeDown.hitTestObject(personagem))
            {
                if (personagem.velocidade.Z > 0)
                {
                    personagem.velocidade.Z = 0;
                }
            }

            if (paredeR.hitTestObject(personagem))
            {
                if (personagem.velocidade.X > 0)
                {
                    personagem.velocidade.X = 0;
                }
            }

            if (paredeL.hitTestObject(personagem))
            {
                if (personagem.velocidade.X < 0)
                {
                    personagem.velocidade.X = 0;
                }
            }

            for (int i = 0; i < InimigoManager.listaInimigos.Count; i++)
            {
                Inimigo1 inimigo = InimigoManager.listaInimigos[i];

                if (paredeUp.hitTestObject(inimigo))
                {
                    if (inimigo.velocidade.Z < 0)
                    {
                        inimigo.velocidade.Z = 0;
                    }
                }

                if (paredeDown.hitTestObject(inimigo))
                {
                    if (inimigo.velocidade.Z > 0)
                    {
                        inimigo.velocidade.Z = 0;
                    }
                }

                if (paredeR.hitTestObject(inimigo))
                {
                    if (inimigo.velocidade.X > 0)
                    {
                        inimigo.velocidade.X = 0;
                    }
                }

                if (paredeL.hitTestObject(inimigo))
                {
                    if (inimigo.velocidade.X < 0)
                    {
                        inimigo.velocidade.X = 0;
                    }
                }

                if (inimigo.vida == 0)
                {
                    //Remover da lista
                    inimigo.visible = false;
                }

                for(int t = 0; t <  TiroManager.listaTiros.Count; t++)
                {

                    Tiro umTiro = TiroManager.listaTiros[t];

                    if (umTiro.hitTestObject(inimigo))
                    {
                        if (umTiro.visible == true)
                        {
                            inimigo.vida -= 10;
                            TiroManager.listaTiros.Remove(umTiro);

                            if (inimigo.vida <= 0)
                            {
                                InimigoManager.listaInimigos.Remove(inimigo);
                                Pontos.Ganhar_pontos(10);
                            }
                        }
                    }
                }
            }

            

            fundo.posicao.X -= (personagem.velocidade.X * 0.5f);
            fundo.posicao.X -= (personagem.velocidade.X * 0.5f);
            fundo.posicao.Y -= (personagem.velocidade.Z * 0.5f);
            fundo.posicao.Y -= (personagem.velocidade.Z * 0.5f);

            fundo.rotacao = (camera.lookAt.X * 0.01f);
        }

        private void SlowGeral()
        {
            this.personagem.velocidadeSlow = this.nivelSlow;

            foreach (Inimigo1 inimigo in InimigoManager.listaInimigos)
            {
                inimigo.velocidadeSlow = this.nivelSlow;
            }

            foreach (Tiro tiro in TiroManager.listaTiros)
            {
                tiro.velocidadeSlow = this.nivelSlow;
            }
        }

        public override void draw(SpriteBatch spriteBatch)
        {
            Game1.Self.GraphicsDevice.Clear(Color.Black);
            spriteBatch.Begin();
            fundo.Draw(spriteBatch);
            spriteBatch.End();
            TiroManager.Draw(camera, Game1.Self.GraphicsDevice);
            InimigoManager.Draw(camera, Game1.Self.GraphicsDevice);
            paredeR.Draw(camera, Game1.Self.GraphicsDevice);
            paredeL.Draw(camera, Game1.Self.GraphicsDevice);
            paredeUp.Draw(camera, Game1.Self.GraphicsDevice);
            paredeDown.Draw(camera, Game1.Self.GraphicsDevice);            
            personagem.Draw(camera, Game1.Self.GraphicsDevice);
            //inimigo.Draw(camera, Game1.Self.GraphicsDevice);
            spriteBatch.Begin();
                #region Texto da Velocidade
            if (this.nivelSlow == 1.6f)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Velocidade: Muito Rápido", new Vector2(25, 25), Color.Orange);
            }

            if (this.nivelSlow == 1.4f)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Velocidade: Rápido", new Vector2(25, 25), Color.Orange);
            }

            if (this.nivelSlow == 1.2f)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Velocidade: Acima do Normal", new Vector2(25, 25), Color.Orange);
            }

            if (this.nivelSlow == 1)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Velocidade: Normal", new Vector2(25, 25), Color.Orange);
            }

            if (this.nivelSlow == 0.83f)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Velocidade: Abaixo do Normal", new Vector2(25, 25), Color.Orange);
            }

            if (this.nivelSlow == 0.71f)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Velocidade: Devagar", new Vector2(25, 25), Color.Orange);
            }

            if (this.nivelSlow == 0.62f)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Velocidade: Muito Devagar", new Vector2(25, 25), Color.Orange);
            }
            #endregion  

            #region Vida do Personagem
            if (personagem.vida == 3)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Vidas Extras: 3", new Vector2(600, 25), Color.Orange);
            }

            if (personagem.vida == 2)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Vidas Extras: 2", new Vector2(600, 25), Color.Orange);
            }

            if (personagem.vida == 1)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Vidas Extras: 1", new Vector2(600, 25), Color.Orange);
            }

            if (personagem.vida == 0)
            {
                spriteBatch.DrawString(Game1.Self.fonte, "Vidas Extras: 0", new Vector2(600, 25), Color.Orange);
            }
            #endregion

            spriteBatch.DrawString(Game1.Self.fonte, "Pontos: " + Pontos.pontos, new Vector2(350, 25), Color.Orange);
            spriteBatch.End();
            
        }

        public override void terminate()
        {
            InimigoManager.listaInimigos.Clear();
            InimigoManager.listaInimigos2.Clear();
            TiroManager.listaTiros.Clear();
        }
    }
}